package bitOperation;

/**
 * @author gh
 * @create 2021-05-30 7:58
 */
public class lee231_isPowerOfTwo {

    //递归Recursion
    public boolean isPowerOfTwo(int n) {
        if (n == 0) {
            return true;

        } else if (n == 1) {
            return false;
        } else if (n % 2 != 0) {
            return false;
        } else {
            return isPowerOfTwo(n / 2);
        }
    }

    /*位运算技巧：
    一个数 n 是 2 的幂，当且仅当 n 是正整数，并且 n 的二进制表示中仅包含 1 个 1
    1二进制最低位1的移除 n&(n-1)=0;
    2补码 (n&-n) ==n，其中 -n 是 n 的相反数，是一个负数。该位运算技巧可以直接获取 n 二进制表示的最低位的 1。
    */
    public boolean isPowerOfTwo2(int n) {
        return n>0&& (n&(n-1))==0;
    }

    public boolean isPowerOfTwo3(int n) {
        return n>0&& (n&-n)==n;
    }

}
